/*
 * Copyright 2009 eBusinessInformation
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.excilys.ymca.command.impl;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.Contacts;
import android.provider.Contacts.People;
import android.util.Log;
import android.widget.Toast;

import com.excilys.ymca.R;
import com.excilys.ymca.command.Command;
import com.excilys.ymca.model.Contact;

/**
 * Commande permettant d'ajouter un contact à l'annuaire du téléphone.
 * 
 * @author Pierre-Yves Ricau ( py.ricau+ymca @ gmail.com )
 * 
 */
public class AddContactCommand implements Command {

	/**
	 * Marqueur pour les logs.
	 */
	private static final String	TAG	= AddContactCommand.class.getSimpleName();

	private final Context		context;
	private final Contact		contact;

	public AddContactCommand(Context context, Contact contact) {
		this.context = context;
		this.contact = contact;
	}

	@Override
	public void execute() {

		/*
		 * On ajoute un marqueur (YMCA) au nom pour distinguer les contacts au
		 * sein de l'annuaire.
		 */
		String name = contact.getName() + " (YMCA)";

		ContentResolver resolver = context.getContentResolver();

		/*
		 * On vérifie si le contact existe déjà, via une requête sur le
		 * ContentResolver.
		 */
		Cursor cur = resolver.query(People.CONTENT_URI, new String[] { Contacts.People._ID }, Contacts.People.NAME + "=?",
				new String[] { name }, null);

		int nbContacts = cur.getCount();
		cur.close();

		/*
		 * Si un contact du même nom existe déjà, on ne l'ajoute pas une
		 * deuxième fois.
		 */
		if (nbContacts != 0) {
			// Message d'information à l'utilisateur.
			Toast.makeText(context, R.string.contact_already_exist, Toast.LENGTH_SHORT).show();
			return;
		}

		ContentValues personValues = new ContentValues();

		personValues.put(Contacts.People.NAME, name);

		/*
		 * Positionné STARRED à 1 pour que le contact soit ajouté aux favoris.
		 */
		personValues.put(Contacts.People.STARRED, 0);

		Uri newPersonUri = Contacts.People.createPersonInMyContactsGroup(resolver, personValues);

		/*
		 * Le contact n'a pas pu être ajouté.
		 */
		if (newPersonUri == null) {
			// Message d'information à l'utilisateur.
			Toast.makeText(context, R.string.contact_add_failed, Toast.LENGTH_SHORT).show();
			return;
		}

		/*
		 * Ajout du numéro de téléphone au contact précédemment créé
		 */
		Uri mobileUri = Uri.withAppendedPath(newPersonUri, Contacts.People.Phones.CONTENT_DIRECTORY);
		ContentValues mobileValues = new ContentValues();
		mobileValues.put(Contacts.Phones.NUMBER, contact.getPhoneNumber());
		mobileValues.put(Contacts.Phones.TYPE, Contacts.Phones.TYPE_WORK);
		Uri phoneUpdate = resolver.insert(mobileUri, mobileValues);
		if (phoneUpdate == null) {
			Log.e(TAG, "Could not insert contact's work phone number");
		}

		/*
		 * Ajout de l'adresse postale au contact précédemment créé
		 */
		Uri addressUri = Uri.withAppendedPath(newPersonUri, Contacts.People.ContactMethods.CONTENT_DIRECTORY);
		ContentValues addressValues = new ContentValues();
		addressValues.put(Contacts.ContactMethods.KIND, Contacts.KIND_POSTAL);
		addressValues.put(Contacts.ContactMethods.TYPE, Contacts.ContactMethods.TYPE_WORK);
		addressValues.put(Contacts.ContactMethods.DATA, contact.getAddress());
		Uri addressUpdate = resolver.insert(addressUri, addressValues);
		if (addressUpdate == null) {
			Log.e(TAG, "Could not insert contact's postal address");
		}

		/*
		 * Ajout de l'email au contact précédemment créé
		 */
		Uri emailUri = Uri.withAppendedPath(newPersonUri, Contacts.People.ContactMethods.CONTENT_DIRECTORY);
		ContentValues emailValues = new ContentValues();
		emailValues.put(Contacts.ContactMethods.KIND, Contacts.KIND_EMAIL);
		emailValues.put(Contacts.ContactMethods.TYPE, Contacts.ContactMethods.TYPE_WORK);
		emailValues.put(Contacts.ContactMethods.DATA, contact.getEmailAddress());
		Uri emailUpdate = resolver.insert(emailUri, emailValues);
		if (emailUpdate == null) {
			Log.e(TAG, "Could not insert contact's email");
		}

		// Message d'information à l'utilisateur.
		Toast.makeText(context, R.string.contact_added, Toast.LENGTH_SHORT).show();

	}

}
